package br.com.ifsp.salto.matriculadp.dados.teste;

import java.util.List;

import org.junit.BeforeClass;
import org.junit.Test;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import br.com.ifsp.salto.matriculadp.dados.IHorarioSemestreDAO;
import br.com.ifsp.salto.matriculadp.negocio.to.CursoTO;
import br.com.ifsp.salto.matriculadp.negocio.to.DisciplinaTO;
import br.com.ifsp.salto.matriculadp.negocio.to.HorarioTO;
import br.com.ifsp.salto.matriculadp.negocio.to.SemestreTO;

import com.google.gson.Gson;

public class HorarioSemestreDAOMysqlTest extends TestUtils {

	private static final int idSemestre = 1;

	private IHorarioSemestreDAO semestreDAO;

	@Override
	@BeforeClass
	public void setUp() {
		ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext(
				"file:WebContent/WEB-INF/testContext.xml");
		semestreDAO = (IHorarioSemestreDAO) ctx.getBean("horarioSemestreDAOMySql");

		ctx.close();
	}

	@Test
	public void testGetCursos() {
		List<CursoTO> cursos = semestreDAO.getCursos();
		assertTrue(cursos.size() > 0);
	}

	@Test
	public void testGetDisciplinasCursos() {
		getDisciplinasTest(1);
		getDisciplinasTest(2);
	}

	private void getDisciplinasTest(long idCurso) {
		List<DisciplinaTO> discs = semestreDAO.getAllDisciplinas(idCurso);

		showJson(idCurso, discs);
	}

	private void showJson(long code, List objs) {
		String json = new Gson().toJson(objs);
		System.out.println(code + " = " + json + "\n");
	}

	@Test
	public void testGetSemestres() {
		List<SemestreTO> semestres = semestreDAO.getSemestres(1);

		showJson(1, semestres);
	}

	@Test
	public void testInsertHorario() {
		try {
			HorarioTO horario = getValidHorarioFake();

			long id = semestreDAO.insertHorarioSemestre(horario, idSemestre);

			assertTrue(id != 0);
		} catch (Exception ex) {
			fail();
		}
	}

	@Test
	public void testInsertSelectHorarioTest() {
		try {
			HorarioTO expected = getValidHorarioFake();

			long eId = semestreDAO.insertHorarioSemestre(expected, idSemestre);

			expected.setCodigo(eId);

			HorarioTO actual = semestreDAO.getHorarioSemestre(idSemestre);

			assertHorarioEquals(expected, actual);
		} catch (Exception e) {
			fail();
		}
	}

	@Test
	public void testInsertUpdateSelectHorario() {
		try {
			// Setando o expected
			HorarioTO expected = getValidHorarioFake();

			semestreDAO.insertHorarioSemestre(expected, idSemestre);

			expected = semestreDAO.getHorarioSemestre(idSemestre);

			// Muda entre os dias o codigo das disciplinas
			randomizeDisciplinas(expected);

			semestreDAO.updateHorarioSemestre(expected);

			HorarioTO actual = semestreDAO.getHorarioSemestre(idSemestre);

			assertHorarioEquals(expected, actual);

		} catch (Exception ex) {
			fail();
		}
	}

}
